Bochs uses a configuration file called a bochsrc to know where to look for disk images, how the Bochs emulation layer should work, etc. When you first start up Bochs, it looks around for its configuration file, and parses it. Here are a few lines from a sample file:
diskc: file="30M.sample", cyl=615, heads=6, spt=17 boot: c |
The syntax used for bochsrc can also be used as command line arguments for Bochs. If you have any spaces in your command line arguments, they should be enclosed in single quotes, for example:
bochs 'boot:a' 'floppya: 1_44=a.img, status=inserted' |
Starting with version 1.3, you can use environment variables in the bochsrc file, for example:
diskc: file="$IMAGES/30M.sample", cyl=615, heads=6, spt=17 boot: c |
Starting with version 2.0, you can can use #include in the bochsrc to read the configuration from other files. Now it is possible to put platform or installation defaults in a global config file (e.g. location of rom images). Put this on top of your config file if the global configuration is stored in /etc:
#include /etc/bochsrc |
The section below lists all the supported bochsrc options.
Examples:
romimage: file=bios/BIOS-bochs-latest, address=0xf0000 |
Examples:
megs: 32 megs: 128 |
Example:
optromimage1: file=optionalrom.bin, address=0xd0000 |
Be sure to use a read-only area, typically between C8000 and EFFFF. These optional ROM images should not overwrite the rombios (located at F0000-FFFFF) and the videobios (located at C0000-C7FFF).
Those ROM images will be initialized by the bios if they contain the right signature (0x55AA).
It can also be a convenient way to upload some arbitary code/data in the simulation, that can be retrieved by the boot loader
Examples:
vgaromimage: bios/VGABIOS-elpin-2.40 vgaromimage: bios/VGABIOS-lgpl-latest |
A VGA BIOS file from Elpin Systems, Inc. is provided in the source and binary distributions.
A free LGPL'd VGA BIOS is also provided in the source and binary distributions.
Examples:
2.88M 3.5" Floppy: floppya: 2_88=a:, status=inserted 1.44M 3.5" Floppy: floppya: 1_44=floppya.img, status=inserted 1.2M 5.25" Floppy: floppyb: 1_2=/dev/fd0, status=inserted 720K 3.5" Floppy: floppya: 720k=/usr/local/bochs/images/win95.img, status=inserted |
Examples:
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15 ata2: enabled=1, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11 ata3: enabled=1, ioaddr1=0x168, ioaddr2=0x360, irq=9 |
Examples:
ata0-master: type=disk, path=10M.img, mode=flat, cylinders=306, heads=4, spt=17, translation=none ata1-master: type=disk, path=2GB.cow, mode=vmware3, cylinders=5242, heads=16, spt=50, translation=echs ata1-slave: type=disk, path=3GB.img, mode=sparse, cylinders=6541, heads=16, spt=63, translation=auto ata2-master: type=disk, path=7GB.img, mode=undoable, cylinders=14563, heads=16, spt=63, translation=lba ata2-slave: type=cdrom, path=iso.sample, status=inserted |
This defines the type and characteristics of all attached ata devices:
Table 4-1. ata devices configuration options
Option | Comments | Possible values |
---|---|---|
type | type of attached device | [disk | cdrom] |
path | path of the image | |
mode | image type, only valid for disks | [flat | concat | external | dll | sparse | vmware3 | undoable | growing | volatile ] |
cylinders | only valid for disks | |
heads | only valid for disks | |
spt | only valid for disks | |
status | only valid for cdroms | [inserted | ejected] |
biosdetect | type of biosdetection | [none | auto], only for disks on ata0 [cmos] |
translation | type of translation done by the bios (legacy int13), only for disks | [none | lba | large | rechs | auto] |
model | string returned by identify device ATA command |
You have to tell the type of the attached device. For Bochs version2.0, it can by disk or cdrom
You have to point the "path" at a hard disk image file, cdrom iso file, or physical cdrom device. To create a hard disk image, try running bximage. It will help you choose the size and then suggest a line that works with it.
In UNIX it is possible to use a raw device as a Bochs hard disk, but WE DON'T RECOMMEND IT for safety reasons.
The path, cylinders, heads, and spt are mandatory for type=disk
The path is mandatory for type=cdrom
The disk translation scheme (implemented in legacy int13 bios functions, and used by older operating systems like MS-DOS), can be defined as:
none : no translation, for disks up to 528MB (1032192 sectors)
large : a standard bitshift algorithm, for disks up to 4.2GB (8257536 sectors)
rechs : a revised bitshift algorithm, using a 15 heads fake physical geometry, for disks up to 7.9GB (15482880 sectors). (don't use this unless you understand what you're doing)
lba : a standard lba-assisted algorithm, for disks up to 8.4GB (16450560 sectors)
auto : autoselection of best translation scheme. (it should be changed if system does not boot)
The mode option defines how the disk image is handled. Disks can be defined as:
flat : one file flat layout
concat : multiple files layout
external : developer's specific, through a C++ class
dll : developer's specific, through a DLL
sparse : stackable, commitable, rollbackable
vmware3 : vmware3 disk support
undoable : flat file with commitable redolog
growing : growing file
volatile : flat file with volatile redolog
Default values are:
mode=flat, biosdetect=auto, translation=auto, model="Generic 1234" |
The biosdetect option has currently no effect on the bios
Examples:
newharddrivesupport: enabled=1 |
Examples:
boot: floppy boot: disk boot: cdrom |
Example:
floppy_bootsig_check: disabled=1 |
The configuration interface is a series of menus or dialog boxes that allows you to edit all the settings that control Bochs's behavior. There are two choices of configuration interface: a text mode version called "textconfig" and a graphical version called "wx". The text mode version uses stdin/stdout and is always available. The graphical version is only compiled when you use "--with-wx" in the configure command. If you do not write a config_interface line, Bochs will choose a default for you (usually textconfig).
Note: wxWindows provides both a configuration interface and a display library. So if you use the "wx" configuration interface, you must also use the "wx" display library.
Examples:
config_interface: textconfig config_interface: wx |
The display library is the code that displays the Bochs VGA screen. Bochs has a selection of about 10 different display library implementations for different platforms. If you run configure with multiple --with-* options, the display_library command lets you choose which one you want to run with. If you do not write a display_library line, Bochs will choose a default for you.
Table 4-2. display_library values
Option | Description |
---|---|
x | use X windows interface, cross platform |
win32 | use native win32 libraries |
carbon | use Carbon library (for MacOS X) |
beos | use native BeOS libraries |
macintosh | use MacOS pre-10 |
amigaos | use native AmigaOS libraries |
sdl | use SDL library, cross platform |
svga | use SVGALIB library for Linux, allows graphics without X windows |
term | text only, uses curses/ncurses library, cross platform |
rfb | provides an interface to AT&T's VNC viewer, cross platform |
wx | use wxWindows library, cross platform |
nogui | no display at all |
Examples:
display_library: x display_library: sdl |
Note: wxWindows provides both a configuration interface and a display library. So if you use the "wx" configuration interface, you must also use the "wx" display library.
Examples:
log: bochsout.txt log: /dev/tty (unix only) log: /dev/null (unix only) |
Examples:
logprefix: %t-%e-@%i-%d logprefix: %i%e%d |
%t : 11 decimal digits timer tick %i : 8 hexadecimal digits of cpu0 current eip %e : 1 character event type ('i'nfo, 'd'ebug, 'p'anic, 'e'rror) %d : 5 characters string of the device, between brackets |
Default is %t%e%d
Examples:
debug: action=ignore info: action=report error: action=report panic: action=ask |
The debug, info, error, and panic lines in the bochsrc control what Bochs will do when it encounters each type of event. The allowed actions are: fatal (terminate bochs), ask (ask the user what to do), report (print information to the console or log file), or ignore (do nothing). The recommended settings are listed in the sample above.
Tip: The safest action for panics is "fatal" or "ask". If you are getting lots of panics and get tired of telling it to continue each time, you can try action=report instead. If you allow Bochs to continue after a panic, don't be surprised if you get strange behavior or crashes after a panic occurs. Please report panic messages to the bochs-developers mailing list unless it is just a configuration problem like "could not find hard drive image."
Examples:
log: debugger.out log: /dev/null (unix only) log: - |
Specifies the device to use as com1. This can be a real serial line, or a pty. To use a pty (under X/Unix), create two windows (xterms, usually). One of them will run bochs, and the other will act as com1. Find out the tty the com1 window using the `tty' command, and use that as the `dev' parameter. Then do `sleep 1000000' in the com1 window to keep the shell from messing with things, and run bochs in the other window. Serial I/O to com1 (port 0x3f8) will all go to the other window.
Examples:
com1: dev=/dev/ttyp9 com1: dev=/dev/cua0 |
This defines a parallel (printer) port. When turned on and an output file is defined emulated printer port sends characters printed by the guest OS into the output file. On some platforms a device filename can be used to send the data to the real parallel port (e.g. "/dev/lp0" on Linux, "lpt1" on win32 platforms).
Examples:
parport1: enabled=1, file="parport.out" parport1: enabled=1, file="/dev/lp0" parport1: enabled=0 |
Examples:
sb16: midimode=1, midi=/dev/midi00, wavemode=1, wave=/dev/dsp, loglevel=2, log=sb16.log, dmatimer=600000 |
Note: The example is wrapped onto several lines for formatting reasons, but it should all be on one line in the actual bochsrc file.
midi: The filename is where the midi data is sent. This can be a device or just a file if you want to record the midi data.
midimode:
0 = No data should be output. 1 = output to device (system dependent - midi denotes the device driver). 2 = SMF file output, including headers. 3 = Output the midi data stream to the file (no midi headers and no delta times, just command and data bytes). |
wave: This is the device/file where wave output is stored.
wavemode:
0 = no data 1 = output to device (system dependent - wave denotes the device driver). 2 = VOC file output, including headers. 3 = Output the raw wave stream to the file. |
log: The file to write the sb16 emulator messages to.
loglevel:
0 = No log. 1 = Only midi program and bank changes. 2 = Severe errors. 3 = All errors. 4 = All errors plus all port accesses. 5 = All errors and port accesses plus a lot of extra information. |
dmatimer: Microseconds per second for a DMA cycle. Make it smaller to fix non-continuous sound. 750000 is usually a good value. This needs a reasonably correct setting for IPS (see below).
Examples:
vga_update_interval: 250000 |
Example:
keyboard_serial_delay: 200 |
Example:
keyboard_paste_delay: 100000 |
Examples:
floppy_command_delay: 50000 |
Examples:
ips: 1000000 |
IPS is used to calibrate many time-dependent events within the bochs simulation. For example, changing IPS affects the frequency of VGA updates, the duration of time before a key starts to autorepeat, and the measurement of BogoMips and other benchmarks. The table below lists some typical IPS settings for different machines[1].
This defines the parameters of the clock inside Bochs:
sync
TO BE COMPLETED (see Greg explaination in bug #536329)
time0
Specifies the start (boot) time of the virtual machine. Use a time value as returned by the time(2) system call. If no time0 value is set or if time0 equal to 1 (special case) or if time0 equal 'local', the simulation will be started at the current local host time. If time0 equal to 2 (special case) or if time0 equal 'utc', the simulation will be started at the current utc time.
Syntax: clock: sync=[none|slowdown|realtime], time0=[timeValue|local|utc] Examples: clock: sync=none, time0=local # Now (localtime) clock: sync=slowdown, time0=315529200 # Tue Jan 1 00:00:00 1980 clock: sync=none, time0=631148400 # Mon Jan 1 00:00:00 1990 clock: sync=realtime, time0=938581955 # Wed Sep 29 07:12:35 1999 clock: sync=realtime, time0=946681200 # Sat Jan 1 00:00:00 2000 clock: sync=none, time0=1 # Now (localtime) clock: sync=none, time0=utc # Now (utc/gmt) Default value are sync=none, time0=local |
Examples:
mouse: enabled=1 mouse: enabled=0 |
Examples:
private_colormap: enabled=1 |
Examples:
usb1: enabled=1, ioaddr=0xFF80, irq=10 |
The ne2k line configures an emulated NE2000-compatible Ethernet adapter, which allows the guest machine to communicate on the network. To disable the NE2000 just comment out the ne2k line.
Examples:
ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:00, ethmod=fbsd, ethdev=xl0 ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:00, ethmod=fbsd, ethdev=en0 #macosx ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:00, ethmod=linux, ethdev=eth0 ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:01, ethmod=win32, ethdev=MYCARD ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=tap, ethdev=tap0 ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=tuntap, ethdev=tun0, script=./tunconfig ioaddr, irc: You probably won't need to change ioaddr and irq, unless there are IRQ conflicts. mac: The MAC address MUST NOT match the address of any machine on the net. Also, the first byte must be an even number (bit 0 set means a multicast address), and you cannot use ff:ff:ff:ff:ff:ff because that's the broadcast address. For the ethertap module, you must use fe:fd:00:00:00:01. There may be other restrictions too. To be safe, just use the b0:c4... address. ethmod: The ethmod value defines which low level OS specific module to be used to access pysical ethernet interface. Current implemented values include : - fbsd : ethernet on freebsd and openbsd - linux : ethernet on linux - win32 : ethernet on win32 - tap : ethernet through a linux tap interface - tuntap : ethernet through a linux tuntap interface ethdev: The ethdev value is the name of the network interface on your host platform. On UNIX machines, you can get the name by running ifconfig. On Windows machines, you must run niclist to get the name of the ethdev. Niclist source code is in misc/niclist.c and it is included in Windows binary releases. script: The script value is optionnal, and is the name of a script that is executed after bochs initialize the network interface. You can use this script to configure this network interface, or enable masquerading. This is mainly useful for the tun/tap devices that only exist during Bochs execution. The network interface name is supplied to the script as first parameter |
Examples:
keyboard_mapping: enabled=0, map= keyboard_mapping: enabled=1, map=gui/keymaps/x11-pc-de.map |
Examples:
keyboard_type: xt keyboard_type: at keyboard_type: mf |
Examples:
user_shortcut: keys=ctrlaltdel user_shortcut: keys=ctrlaltesc |
Example:
cmosimage: cmos.img |
The diskc and diskd options are deprecated. Use "ataX-*: type=disk,..." options instead.
Examples:
diskc: file=10M.img, cyl=306, heads=4, spt=17 diskc: file=112M.img, cyl=900, heads=15, spt=17 diskd: file=483.img, cyl=1024, heads=15, spt=63 |
Note: You cannot use both diskd and cdromd together.
The cdromd option is deprecated. Use "ataX-*: type=cdrom,..." option instead.
Examples:
cdromd: dev=/dev/cdrom, status=inserted (Unix only) cdromd: dev=e:, status=inserted (Windows only) cdromd: dev=cdromimage.iso, status=inserted |
Note: You cannot use both diskd and cdromd together.
The pit option is deprecated. Use the "clock" option instead.
Examples:
pit: realtime=0 pit: realtime=1 |
The time0 option is deprecated. Use the "clock" option instead.
Examples:
time0: 938581955 |
[1] | IPS measurements depend on OS and compiler configuration in addition to processor clock speed. |